<?php declare(strict_types = 1);


namespace App\Service;

use Qbhy\SimpleJwt\Exceptions\InvalidTokenException;
use Qbhy\SimpleJwt\Exceptions\SignatureException;
use Qbhy\SimpleJwt\Exceptions\TokenExpiredException;
use Qbhy\SimpleJwt\JWT;
use Qbhy\SimpleJwt\JWTManager;

class JwtService
{

    /**
     * @var JWTManager
     */
    private JWTManager $JWTManager;


    public function __construct()
    {
        $cache = static fn(JWTManager $JWTManager) => new \Doctrine\Common\Cache\FilesystemCache(BASE_PATH.'/'.env('JWT_DIR'));
        // 实例化 jwt manager
        $jwtManager = new JWTManager(['secret' => \env('JWT_SECRET'), 'cache' => $cache]);
        // 设置 token 有效时间，单位 秒
        $jwtManager->setTtl((int)env('JWT_TTL'));
        // 设置 token 过期后多久时间内允许刷新，单位 分钟
        //        $jwtManager->setRefreshTtl(\env('jwt'));
        // 通过 jwt manager 实例化 jwt ，标准 jwt
        $this->JWTManager = $jwtManager;
    }

    /**
     * 生成token
     * @param $payLoad
     * @param $headers
     * @return string
     */
    public function genToken($payLoad, $headers=[]): string
    {
        return $this->JWTManager->make($payLoad, $headers)->token();
    }

    /**
     * 检查jwt是否正确、合法，有误会抛出错误，
     * @param $token
     * @return JWT
     * @throws InvalidTokenException
     * @throws SignatureException
     * @throws TokenExpiredException
     */
    public function check($token): JWT
    {
        return $this->JWTManager->parse($token);
    }

    /**
     * 获取jwt中的用户信息
     * @param JWT $jwt
     * @return array
     */
    public function getJwtData(JWT $jwt): array
    {
        return $jwt->getPayload();
    }
}